package fiuba.algo3.algothief;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class Juego {

	private static final int ARRESTOSDETECTIVE = 5;
	private static final int ARRESTOSINVESTIGADOR = 10;
	private static final int ARRESTOSSARGENTO = 20;
	private static final float TIEMPOINICIAL = 216;
	private Jugador jugador;
	private Caso caso;
	private static int cantidadDeCasosResueltos;
	
	public Juego(String nombreJugador) {
		this.jugador = new JugadorNovato(nombreJugador,null,TIEMPOINICIAL,null);
		this.caso = new Caso();
		cantidadDeCasosResueltos = 0;
	}
	
	
	public Element serializar(Document doc) {
		Element elementoJuego = doc.createElement("Juego");
		elementoJuego.setAttribute("cantidadDeCasosResueltos",Integer.toString(cantidadDeCasosResueltos));
		elementoJuego.appendChild(this.jugador.serializar(doc));
		elementoJuego.appendChild(this.caso.serializar(doc));	
		return elementoJuego;
	}

	
	public static Juego hidratar(Document doc) {
		Juego nuevoJuego = new Juego("");
		Element elementoJuego = (Element)doc.getElementsByTagName("Juego").item(0);
		nuevoJuego.setCantidadDeCasosResueltos(Integer.parseInt(elementoJuego.getAttribute("cantidadDeCasosResueltos")));
		Element elementoJugador = (Element)elementoJuego.getElementsByTagName("Jugador").item(0);
		if (cantidadDeCasosResueltos < ARRESTOSDETECTIVE)
			nuevoJuego.jugador = JugadorNovato.hidratar(elementoJugador);
		else if (cantidadDeCasosResueltos < ARRESTOSINVESTIGADOR)
			nuevoJuego.jugador = JugadorDetective.hidratar(elementoJugador);
		else if (cantidadDeCasosResueltos < ARRESTOSSARGENTO)
			nuevoJuego.jugador = JugadorInvestigador.hidratar(elementoJugador);
		else
			nuevoJuego.jugador = JugadorSargento.hidratar(elementoJugador);
		nuevoJuego.jugador.setAlarmaGanarJuego(new AlarmaGanarJuego());
		nuevoJuego.jugador.setAlarmaRecibiBalazo(new AlarmaRecibiBalazo());
		nuevoJuego.jugador.setAlarmaMeAcuchillaron(new AlarmaMeAcuchillaron());
		nuevoJuego.caso = Caso.hidratar(doc);
		return nuevoJuego;
	}

	
	public int getCantidadDeCasosResueltos() {
		return cantidadDeCasosResueltos;
	}
	

	public void setCantidadDeCasosResueltos(int casosResueltos) {
		cantidadDeCasosResueltos = casosResueltos;
	}
	
	
	public Jugador getJugador() {
		return this.jugador;
	}
	

	public Caso getCaso() {
		return this.caso;
	}
	

	public void armarCaso(AlarmasPistas alarmaGanarJuego, AlarmasPistas alarmaRecibirBalazo, AlarmasPistas alarmaMeAcuchillaron ) {
		ConfiguracionInicial ci = new ConfiguracionInicial(this.jugador);
		File archivo = new File("ciudades.xml");
		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder dBuilder=null;
		try {
			dBuilder = dbFactory.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		Document docCiudades = null;
		try {
			docCiudades = dBuilder.parse(archivo);
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		docCiudades.getDocumentElement().normalize();
		File archivoCriminal = new File("criminal.xml");
		Document docCriminal = null;
		try {
			docCriminal = dBuilder.parse(archivoCriminal);
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		docCriminal.getDocumentElement().normalize();
		ci.levantarConfiguracionInicial(docCiudades, docCriminal);
		
		this.caso.armar(ci);
		this.jugador.ciudadActual = this.caso.getCriminal().getCiudadInicial();
		Interpol interpol = new Interpol(this.caso.getCriminal());
		interpol.setPelos(ci.getPelosCriminales());
		interpol.setSenias(ci.getSeniasCriminales());
		interpol.setHobbies(ci.getHobbiesCriminales());
		interpol.setVehiculos(ci.getVehiculosCriminales());
		interpol.setSexos(ci.getSexosCriminales());
		interpol.setCriminales(ci.getCriminales());
		jugador.setInterpol(interpol);
		jugador.setAlarmaGanarJuego(alarmaGanarJuego);
		jugador.setAlarmaRecibiBalazo(alarmaRecibirBalazo);
		jugador.setAlarmaMeAcuchillaron(alarmaMeAcuchillaron);
	}
	
	
	public void setJugador(Jugador jugador) {
		this.jugador = jugador;
	}
	
	
	public void setCaso(Caso caso) {
		this.caso = caso;
	}
	
	
	public static void incrementarCasosResueltos(){
		cantidadDeCasosResueltos = cantidadDeCasosResueltos + 1;
	}
	
	public void nuevoCaso(AlarmasPistas alarmaGanarJuego, AlarmasPistas alarmaRecibirBalazo, AlarmasPistas alarmaMeAcuchillaron) {
		this.caso = new Caso();
		String nombre = this.jugador.getNombre();
		jugador = new JugadorNovato(nombre,null,TIEMPOINICIAL,null);
		if (cantidadDeCasosResueltos >= ARRESTOSDETECTIVE)
		{
			if (cantidadDeCasosResueltos < ARRESTOSINVESTIGADOR)
				jugador = new JugadorDetective(nombre,null,TIEMPOINICIAL,null);
			else if (cantidadDeCasosResueltos < ARRESTOSSARGENTO)
				jugador = new JugadorInvestigador(nombre,null,TIEMPOINICIAL,null);
			else
				jugador = new JugadorSargento(nombre,null,TIEMPOINICIAL,null);
		}
		this.armarCaso(alarmaGanarJuego,alarmaRecibirBalazo,alarmaMeAcuchillaron);
	}
}
